package game.model;

import java.util.HashSet;
import java.util.Set;

/**
 * Clase que representa un espejo simple.
 * La base de funcionamiento de los demas espejos.
 *
 */

public class EspejoSimple extends Espejo {
	
	/**
	 * Constructor del espejo simple
	 * 
	 * @param orientacion orientacion inicial del espejo simple.
	 */
	
	public EspejoSimple(int orientacion) {
		this.setOrientacion(orientacion);
		setImagen(3);
	}
	
	public Set<Rayo> getSalida(Rayo entrada) {
		int parcial;
		int desfasaje = (this.getOrientacion()+2)%4;
		Set<Rayo> salida = new HashSet<Rayo>();
		parcial = (4 + entrada.getOrientacion() - desfasaje) % 4;
		if(parcial == 1){
			parcial = (2 + desfasaje) % 4;
			parcial = (parcial+2)%4;
			Rayo rayoSalida = new Rayo(entrada.getColor(), parcial);
			rayoSalida.setImagen(10);
			rayoSalida.setEntrando(false);
			salida.add(rayoSalida);
		} else if(parcial == 2){
			parcial = (1 + desfasaje) % 4;
			parcial = (parcial+2)%4;
			Rayo rayoSalida = new Rayo(entrada.getColor(), parcial);
			rayoSalida.setImagen(10);
			rayoSalida.setEntrando(false);
			salida.add(rayoSalida);
		}
		return salida;
	}

	@Override
	public Set<Rayo> getSalida(Rayo entrada, Set<Rayo> anterior) {
		Set<Rayo> auxi = new HashSet<Rayo>();
		Rayo[] dir = new Rayo[4];
		
		for(Rayo rayo : anterior){
			int i;
			if(rayo.isEntrando()){
				i = rayo.getOrientacion();
			} else {
				i = (rayo.getOrientacion()+2)%4;
			}
			dir[i] = rayo;
		}
		
		Rayo entradaAuxi = new Rayo(entrada.getColor(), entrada.getOrientacion());
		entradaAuxi.setImagen(9);
		entradaAuxi.setEntrando(true);

		auxi.addAll(getSalida(entrada));
		auxi.add(entradaAuxi);
		
		for(Rayo rayo : auxi){
			int i;
			if(rayo.isEntrando()){
				i = rayo.getOrientacion();
			} else {
				i = (rayo.getOrientacion()+2)%4;
			}
			dir[i] = rayo;
		}
		
		anterior.clear();
		
		for(int i=0; i < dir.length; i++){
			if(dir[i] != null){
				anterior.add(dir[i]);
			}
		}		
		return getSalida(entrada);
	}
	
	@Override
	public String salvarEstado(String ubicacion) {
		return ubicacion + "3" + "," + getOrientacion() + "," + "0" + "," + "0" + "," + "0";
	}
	
	@Override
	public void rotar() {
		this.setOrientacion((this.getOrientacion() + 1) % 4);
	}
}

